package com.atguigu.gmall.item.service.impl;

import com.atguigu.gmall.common.constant.RedisConst;
import com.atguigu.gmall.common.util.Jsons;
import com.atguigu.gmall.item.service.CacheOpsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.concurrent.TimeUnit;

/**
 * ClassName: CacheOpsServiceImpl
 * Package: com.atguigu.gmall.item.service.impl
 * Description:
 *
 * @Author ltystart
 * @Create 2025/8/28 23:00
 * @Version 1.0
 */
@Service
public class CacheOpsServiceImpl implements CacheOpsService {
    @Autowired
    private StringRedisTemplate redisTemplate;

    /**
     * 获取缓存数据，有东西返回对象，没有返回null
     *
     * @param key
     * @param clazz
     * @param <T>
     * @return
     */
    @Override
    public <T> T getCache(String key, Class<T> clazz) {
        //查询redis
        String json = redisTemplate.opsForValue().get(key);
        if (StringUtils.isEmpty(json)) {
            return null;
        } else {
            T t = Jsons.toObj(json, clazz);
            return t;
        }
    }

    /**
     * 保存数据到缓存中
     *
     * @param key
     * @param data
     * @param ttl
     * @param timeUnit
     */
    @Override
    public void saveData(String key, Object data, Long ttl, TimeUnit timeUnit) {
        String json = data == null ? RedisConst.TEMP_DATA : Jsons.toStr(data);

        //缓存中的每个数据都应该有过期时间，临时数据缓存短一点时间
        if (data == null) {
            redisTemplate.opsForValue().set(key, json, RedisConst.TEMP_DATA_TTL, RedisConst.TEMP_DATA_TTL_UNIT);
        } else {
            redisTemplate.opsForValue().set(key, json, ttl, timeUnit);
        }
    }
}
